#ifndef AVPACKET_MANAGER_H
#define AVPACKET_MANAGER_H
#include "Data/SafeQueue.hpp"
extern "C" {
#include <libavcodec/avcodec.h>
}
#define SDL_MAIN_HANDLED
#include <SDL.h>
#include <memory> // 引入 shared_ptr

class MyAVPacketList {
public:
    AVPacket pkt;
    int serial;

    MyAVPacketList() = default;

    MyAVPacketList(const MyAVPacketList& other) {
        av_packet_ref(&pkt, &other.pkt);
        serial = other.serial;
    }
    // 移动构造函数
    MyAVPacketList(MyAVPacketList&& other) noexcept {
        av_packet_move_ref(&pkt, &other.pkt);
        serial = other.serial;

    }


    // 重载 operator==
    friend bool operator==(const MyAVPacketList& lhs, const MyAVPacketList& rhs) {
        return lhs.serial == rhs.serial;
    }
};

class AVPacketManager {
public:
    // 构造函数
    AVPacketManager();

    // 析构函数
    ~AVPacketManager();

    AVPacketManager(const AVPacketManager& other) : packet_queue(other.packet_queue) {
        // 拷贝其他成员变量
        serial = other.serial;
        duration = other.duration;
        // 如果 AVPacketManager 类有其他成员变量，也需要在这里进行拷贝
    }


    // 初始化队列
    int init();

    // 向队列中添加一个 AVPacket
    int put(AVPacket *pkt);

    // 从队列中获取一个 AVPacket，
    int get(AVPacket *pkt, std::chrono::microseconds timeout= std::chrono::microseconds::max());

    // 清空队列
    void flush();

    // 设置是否终止队列操作，用于安全快速退出播放
    void set_abort_request(bool value);

    void set_type_name(const std::string & name) {
        type_name = name;
    }
    std::string get_type_name() {
        return type_name;
    }

    // 获取队列实际占据的字节数
    size_t get_total_size();

    size_t size(){
        return packet_queue.size();
    }


private:
    SafeQueue<std::shared_ptr<MyAVPacketList>> packet_queue; // 使用 SafeQueue 替换原始的 PacketQueue 结构体
    int serial; // 序列号
    uint64_t duration;
    std::string type_name;
};

#endif // AVPACKET_MANAGER_H

